﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>无标题页</title>
    <script type="text/javascript">
    (function(){
	if( !window.Connection )
		window.Connection = {};
	window.Connection.loadCallback = (function(){
		/*
		 * param参数说明
		 * @param { Object } param 包括如下属性
		 * name - {String} (可选)从服务器返回的callback函数名称
		 * key - {String} (可选)传递给服务器的callback函数的参数名，例如xxxx?key=callbackFunction，默认值为"callback"
		 * url - {String} (必填)请求的URL
		 * success - {Function} (必填)请求成功后的处理函数
		 * error - {Function}(选填)请求失败后的处理函数
		 */
		/*根据规则处理用户参数*/
		function initParam( param ){
			/*如果未指定callback函数，则表示是可以通过URL中的参数来传递callback函数名的，在此自动生成一个callback函数并作为query string加到URL之后*/
			if( !param.name ){
				param.name = '_callback_func_' + (+new Date());
			}
			/*如果未指定query string中表示callback函数名的参数则默认为callback*/
			if( !param.key ){
				param.key = 'callback';
			}
			/*重构URL*/
			var url = param.url;
			var index = url.indexOf('?');
			if( index < 0 ){
				param.url += '?' + param.key + '=' + param.name;
			}
			else{
				/*查找query string中是否已经包含了名为param.key的参数名，如果已经包含则忽略*/
				var queryString = url.substring(index+1);
				var existed = false;
				var pairs = queryString.split('&');
				for( var i = 0, len = pairs.length; i < len; i++){
					var p = pairs[i];
					if( p.split('=')[0] == param.key ){
						existed = true;
						break;
					}
				}
				if( !existed ){
					param.url += '&' + param.key + '=' + param.name;
				}
			}
			return param;
		}

		/*IE*/
		function loadIECallback(param){
			param = initParam(param);
			/*清除，防止内存泄露*/
			function clear(){
				frag = script = script.onreadystatechange = frag[param.name] = null;
			}
			var charset = param.charset || 'gb2312';
			/*创建一个DocumentFragment充当script元素的父容器，这样的好处是不需要将节点真正的加入到DOM树中*/
			var frag = document.createDocumentFragment(), script = document.createElement('script');
			script.charset = charset;
			/*将callback函数定义在DocumentFragment上，script返回后可以直接调用到该函数*/
			frag[param.name] = function () {
				/*调用用户传入的callback*/
				param.success && param.success.apply(null, arguments);
				/*使用完成后清除垃圾信息*/
				clear();
			};
			/*注册script的onreadystatechange事件
			 *一般情况，IE6下script的readyState会经历loading、interactive和loaded，
			 *IE7下没有interactive(表示加载的数据虽然未完成但已经可以使用)状态，
			 *而在interactive(IE7下则是loading之后和loaded之前)状态后请求的callback数据其实已经到达并可用
			 *也就是说如果正常请求到数据，则在loaded状态前定义在DocumentFragment上的Callback就会被执行。
			 *由于加载成功后onreadystatechange事件会被清空，因此一旦readyState到达了loaded状态则表示加载错误。
			 */
			script.onreadystatechange = function () {
				if (script.readyState == 'loaded') {
					param.error && param.error();
					clear();
				}
			};
			script.src = param.url;
			frag.appendChild(script);
		}

		/*其他浏览器*/
		function loadOther(param){
			param = initParam(param);
			/*清除，防止内存泄露*/
			function clear(){
				iframe.callback = iframe.errorcallback = null;
				iframe.src = 'about:blank', iframe.parentNode.removeChild(iframe), iframe = null;
			}
			var charset = param.charset || 'gb2312';
			/*采用iframe可以对错误进行响应*/
			var iframe = document.createElement('iframe');
			iframe.style.display = 'none';
			
			/*在iframe的frameElement上定义callback*/
			iframe.callback = function () {
				param.success && param.success.apply(null, arguments);
				clear();
			};
			iframe.errorcallback = function () {
				param.error && param.error();
				clear();
			};
			try {
				document.body.appendChild(iframe);
				var doc = iframe.contentWindow.document;
				doc.open();
				doc.write(
					/*在iframe内容中定义真是的callback函数，以供正确请求到数据后进行响应，如果正确地请求到数据则会执行success回调并删除对错误的响应函数*/
					'<script type="text\/javascript">function ' + param.name + '() { window.frameElement.callback.apply(null, arguments); }<\/script>'
					/*写入script标签请求数据*/
					+ '<script type="text\/javascript" src="' + param.url + '" charset="' + charset + '"><\/script>'
					/*如果没有请求道正确的数据，则会顺利执行完下面的脚步片段，对错误进行响应*/
					+ '<script type="text\/javascript">window.setTimeout("try { window.frameElement.errorcallback(); } catch (exp) {}", 1)<\/script>'
				);
				doc.close();
			} catch (exp) {}
		}
		return /MSIE/.test(window.navigator.userAgent) ? loadIECallback : loadOther;
	})();	
})();
    </script>
</head>
<body>

</body>
</html>
